home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Languages / PowerMacOberon 1.2 / Source / Elems / AutoMenuElems.Mod (.txt) next >
Oberon Text  |  1995-08-22  |  3KB  |  86 lines

  1. Syntax10.Scn.Fnt
  2. StampElems
  3. Alloc
  4. 9 May 95
  5. Syntax10b.Scn.Fnt
  6. Syntax10i.Scn.Fnt
  7. MarkElems
  8. Alloc
  9. MODULE AutoMenuElems; (* mah 18 Nov 94 / 
  10. (*------------------------------------------------------------------------------------
  11. Automatically installs a TextFrame handler that searches for AutoMenuElems throughout its text and adds
  12. these to its menu.
  13. ------------------------------------------------------------------------------------*)
  14. IMPORT Display, Viewers, Texts, TextFrames, PopupElems, HandlerElems, MenuViewers;
  15. CONST
  16.     left =2; middle = 1; right = 0;
  17.     cancel = {left, middle, right};
  18.     Elem* = POINTER TO ElemDesc;
  19.     ElemDesc* = RECORD (PopupElems.ElemDesc) done: BOOLEAN END;
  20.     SuperHandle: Display.Handler;
  21.     w: Texts.Writer;
  22. (*----- AutoMenu Elements -----*)
  23. PROCEDURE 
  24. Handle* (e: Texts.Elem; VAR m: Texts.ElemMsg);
  25.     VAR e1: Elem;
  26. BEGIN
  27.     WITH e: Elem DO
  28.         WITH m: Texts.CopyMsg DO
  29.             IF m.e = NIL THEN NEW(e1); e1.done := TRUE; m.e := e1 END;
  30.             PopupElems.Handle(e, m)
  31.         | m: Texts.IdentifyMsg DO
  32.             m.mod := "AutoMenuElems"; m.proc := "Alloc"
  33.         ELSE PopupElems.Handle(e, m)
  34.         END
  35. END Handle;
  36. PROCEDURE 
  37. Alloc*;
  38.     VAR e: Elem;
  39. BEGIN
  40.     NEW(e); e.handle := Handle; e.done := FALSE; Texts.new := e
  41. END Alloc;
  42. PROCEDURE 
  43. Insert*;
  44.     VAR e: Elem; insert: TextFrames.InsertElemMsg;
  45. BEGIN
  46.     NEW(e); e.handle := Handle; e.name := "AutoMenu"; e.small := TRUE; e.done := TRUE;
  47.     e.menu := TextFrames.Text(""); PopupElems.MeasureMenu(e);
  48.     insert.e := e; Viewers.Broadcast(insert)
  49. END Insert;
  50. (*----- Frame -----*)
  51. PROCEDURE CreateMenu (f: TextFrames.Frame; VAR r: Texts.Reader);
  52. VAR written: BOOLEAN; copy: Texts.CopyMsg; e1: Elem; menu: Texts.Text; v: Viewers.Viewer; ch: CHAR;
  53. BEGIN written := FALSE;
  54.     REPEAT
  55.         IF (r.elem IS Elem) & (~r.elem(Elem).done) THEN
  56.             NEW(e1); copy.e := e1; PopupElems.Handle (r.elem, copy);
  57.             Texts.WriteElem (w, e1);
  58.             r.elem(Elem).done := TRUE;
  59.             written := TRUE
  60.         END;
  61.         Texts.ReadElem (r)
  62.     UNTIL r.elem = NIL;
  63.     IF written THEN
  64.         v := Viewers.This (f.X, f.Y);
  65.         menu := v.dsc(TextFrames.Frame).text;
  66.         Texts.OpenReader(r, menu, menu.len - 1); Texts.Read(r, ch);
  67.         IF ch = '!' THEN Texts.Insert (menu, menu.len-1, w.buf) ELSE Texts.Append (menu, w.buf) END
  68. END CreateMenu;
  69. PROCEDURE 
  70. FrameHandler* (f: Display.Frame; VAR m: Display.FrameMsg);
  71. VAR r: Texts.Reader;
  72. BEGIN
  73.     WITH f: TextFrames.Frame DO
  74.         WITH m: MenuViewers.ModifyMsg DO
  75.             SuperHandle (f, m);
  76.             Texts.OpenReader (r, f.text, 0); Texts.ReadElem (r);
  77.             WHILE (r.elem # NIL) & ~(r.elem IS Elem) DO Texts.ReadElem (r) END;
  78.             IF (r.elem # NIL) & (r.elem(Elem).done = FALSE) THEN CreateMenu (f, r) END
  79.         ELSE SuperHandle(f, m)
  80.         END
  81. END FrameHandler;
  82. BEGIN
  83.     HandlerElems.SetHandler("AutoMenuElems.FrameHandler", FrameHandler, SuperHandle);
  84.     Texts.OpenWriter(w)
  85. END AutoMenuElems.
  86.